package com.gin.no_gay_alliance.fragment.item;

import android.annotation.SuppressLint;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewbinding.ViewBinding;

import com.gin.nga.enums.ItemType;
import com.gin.nga.response.body.nuke.ItemBody;
import com.gin.nga.response.field.item.ItemData;
import com.gin.no_gay_alliance.adpter.ItemViewAdapter;
import com.gin.no_gay_alliance.app.MyApplication;
import com.gin.no_gay_alliance.callback.Callback;
import com.gin.no_gay_alliance.customview.ItemView;
import com.gin.no_gay_alliance.exception.RequireParamException;
import com.gin.no_gay_alliance.fragment.base.BaseBindingFragment;
import com.gin.no_gay_alliance.itemdecoration.SimpleItemDecoration;
import com.gin.no_gay_alliance.param.ItemParam;
import com.gin.no_gay_alliance.viewmodel.ItemModel;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 道具列表的基类
 *
 * @author : ginstone
 * @version : v1.0.0
 * @since : 2023/9/8 13:47
 **/
public abstract class BaseItemFragment<T extends ViewBinding> extends BaseBindingFragment<T> implements Callback<ItemBody> {
    public static final String ARG_KEY = ItemParam.class.getName();
    /**
     * 是否还有下一页
     */
    protected boolean hasNext = true;
    /**
     * 当前页
     */
    protected int page = 0;
    /**
     * 道具数据
     */
    protected List<ItemModel> data;
    /**
     * 操作参数
     */
    @NonNull
    protected ItemView.Params params;
    /**
     * 适配器
     */
    protected ItemViewAdapter adapter;
    /**
     * 道具参数
     */
    protected ItemParam itemParam;

    private boolean loading = false;

    /**
     * 根据道具参数生成 ItemView参数
     *
     * @param param 道具参数
     * @return ItemView参数
     */
    protected abstract ItemView.Params buildParams(ItemParam param);

    /**
     * 提供布局中的 RecyclerView
     *
     * @return RecyclerView
     */
    @NonNull
    protected abstract RecyclerView initRecyclerView();


    /**
     * 发送请求
     *
     * @param more 是否为加载更多, 否时从第一页开始
     */
    protected abstract void sendRequest(boolean more);

    /**
     * onCreateView 的后续操作
     */
    @Override
    protected void onCreateView() {
        // 初始化适配器
        data = new ArrayList<>();
        adapter = new ItemViewAdapter(requireContext(), data);
        // 传递操作参数
        params = buildParams(itemParam);
        adapter.setParams(params);


        // 初始化 RecyclerView
        RecyclerView rv = initRecyclerView();
        rv.addItemDecoration(new SimpleItemDecoration());
        rv.setAdapter(adapter);
    }

    /**
     * 获取和处理参数
     *
     * @param arguments 参数
     */
    @Override
    protected void handleArguments(Bundle arguments) {
        if (arguments != null && arguments.getParcelable(ARG_KEY) != null) {
            itemParam = arguments.getParcelable(ARG_KEY);
        } else {
            throw new RequireParamException(ARG_KEY);
        }
    }


    /**
     * 请求成功回调
     *
     * @param data 数据
     */
    @SuppressLint("NotifyDataSetChanged")
    @Override
    public void onSuccess(ItemBody data) {
        loading = false;
        ItemData itemData = data.getData();
        hasNext = itemData.isHasNext();
        // 新数据
        List<ItemModel> models = itemData.getData().stream().map(ItemModel::new).filter(this::filter).collect(Collectors.toList());

        int index = this.data.size();
        this.data.addAll(models);
        ui(() -> {
            if (index == 0) {
                adapter.notifyDataSetChanged();
            } else {
                adapter.notifyItemRangeInserted(index, models.size());
            }
        });

        //如果还有更多 直接加载
        if (hasNext) {
            uiDelayed(() -> load(true), 200);
        }
    }


    /**
     * 加载
     *
     * @param more 是否为加载更多, 否时从第一页开始
     */
    protected void load(boolean more) {
        if (loading) {
            return;
        }
        if (!more) {
            page = 0;
            hasNext = true;
            adapter.notifyItemRangeRemoved(0, data.size());
            data.clear();
        }
        if (hasNext) {
            page++;
            loading = true;
            sendRequest(more);
        }
    }

    /**
     * 决定一个道具是否应当显示在列表中
     *
     * @param item 道具信息
     * @return 是否应当显示
     */
    private boolean filter(ItemModel item) {
        // 当操作类型为购买时 全部显示
        if (params.action == ItemView.Action.BUY) {
            return true;
        }
        if (params.userId != null) {
            // 只显示对人道具，或者对自己使用时显示徽章
            boolean toSelf = MyApplication.getClient().getUserId() == params.userId;
            return item.type == ItemType.TO_USER || (toSelf && item.type == ItemType.MEDAL);
        } else if (params.topicId != null && params.replyId != null) {
            // 只显示对贴道具
            return item.type == ItemType.TO_REPLY;
        }
        return true;
    }

    /**
     * 设置道具参数
     *
     * @param itemParam
     */
    public void setItemParam(ItemParam itemParam) {
        Bundle args = new Bundle();
        args.putParcelable(ARG_KEY, itemParam);
        setArguments(args);
    }
}
